package com.bill99.codecheck.sonar.service.impl;

import java.io.File;

import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
import org.tmatesoft.svn.core.wc.ISVNOptions;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNUpdateClient;
import org.tmatesoft.svn.core.wc.SVNWCUtil;

import com.bill99.codecheck.sonar.service.SvnCheckOutService;
import com.bill99.riaframework.common.helper.Bill99Logger;

/**
 * 
 * 在服务器建立临时文件夹路径及checkout至临时文件
 *
 */
public class SvnCheckOutServiceImpl implements SvnCheckOutService {
	private Bill99Logger logger = Bill99Logger.getLogger(this.getClass());

	private String svnUserName;
	private String svnPassword;

	@Override
	public void svnCheckOut(String svnpath, String temppath) {
		// 初始化支持svn://协议的库。 必须先执行此操作。
		SVNRepositoryFactoryImpl.setup();
		// 相关变量赋值
		SVNURL repositoryURL = null;
		try {
			repositoryURL = SVNURL.parseURIEncoded(svnpath);
		} catch (SVNException e) {
			logger.info("SVN无法连接");
		}
		ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
		// 实例化客户端管理类
		SVNClientManager ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, svnUserName, svnPassword);
		File wcDir = new File(temppath);
		wcDir.mkdirs();
		// 通过客户端管理类获得updateClient类的实例。
		SVNUpdateClient updateClient = ourClientManager.getUpdateClient();
		// sets externals not to be ignored during the checkout
		updateClient.setIgnoreExternals(false);
		// 执行check out 操作，返回工作副本的版本号。
		long workingVersion;
		try {
			workingVersion = updateClient.doExport(repositoryURL, wcDir, SVNRevision.HEAD, SVNRevision.HEAD, null, true, SVNDepth.UNKNOWN);
			logger.info("把版本：" + workingVersion + " check out 到目录：" + wcDir + "中。");
		} catch (SVNException e) {
			logger.info("check out 异常");
			e.printStackTrace();
		}
	}

	public void setSvnUserName(String svnUserName) {
		this.svnUserName = svnUserName;
	}

	public void setSvnPassword(String svnPassword) {
		this.svnPassword = svnPassword;
	}

}
